library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6 ✔ purrr 0.3.4
✔ tibble 3.1.7 ✔ dplyr 1.0.9
✔ tidyr 1.2.0 ✔ stringr 1.4.0
✔ readr 2.1.2 ✔ forcats 0.5.1
── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
library(janitor)
Attaching package: ‘janitor’
The following objects are masked from ‘package:stats’:
chisq.test, fisher.test
library(skimr)
library(tsibble)
Attaching package: ‘tsibble’
The following objects are masked from ‘package:base’:
intersect, setdiff, union
library(lubridate)
Attaching package: ‘lubridate’
The following object is masked from ‘package:tsibble’:
interval
The following objects are masked from ‘package:base’:
date, intersect, setdiff, union
beds <- read_csv("raw_data/non_covid_raw_data/beds_by_nhs_board_of_treatment_and_specialty.csv") %>%
clean_names()
Warning: One or more parsing issues, see `problems()` for details
Rows: 30458 Columns: 20
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (10): Quarter, QuarterQF, HB, HBQF, Location, LocationQF, Specialty, SpecialtyQF, SpecialtyName, SpecialtyNameQF
dbl (5): AllStaffedBeddays, TotalOccupiedBeddays, AverageAvailableStaffedBeds, AverageOccupiedBeds, PercentageOccupancy
lgl (5): AllStaffedBeddaysQF, TotalOccupiedBeddaysQF, AverageAvailableStaffedBedsQF, AverageOccupiedBedsQF, PercentageOccupancyQF
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
glimpse(beds)
skim(beds)
view(beds)
beds %>%
arrange(desc(all_staffed_beddays))
beds %>%
distinct(location)
beds %>%
distinct(hb)
beds %>%
distinct(all_staffed_beddays)
beds %>%
distinct(total_occupied_beddays)
beds %>%
ggplot(aes(x = all_staffed_beddays)) +
geom_histogram(col = "white")+
scale_x_log10()
beds %>%
ggplot(aes(x = total_occupied_beddays)) +
geom_histogram(col = "white")+
scale_x_log10()
beds %>%
ggplot(aes(x = average_occupied_beds)) +
geom_histogram(col = "white")+
scale_x_log10()
beds %>%
ggplot(aes(x = percentage_occupancy)) +
geom_histogram(col = "white")
beds_select <- beds %>%
mutate(date = yq(quarter),
year = year(date),
month = month(date, label = TRUE, abbr = FALSE),
season = case_when(
str_detect(month, "January") ~ "Winter",
str_detect(month, "April") ~ "Spring",
str_detect(month, "July") ~ "Summer",
str_detect(month, "October") ~ "Autumn"),
season = factor(season, order = TRUE)) %>%
select(quarter, hb, location, specialty_name, all_staffed_beddays, total_occupied_beddays, average_available_staffed_beds, average_occupied_beds, percentage_occupancy, date, year, month, season)
beds_select %>%
filter(!is.na(percentage_occupancy)) %>%
group_by(quarter) %>%
summarise(mean_percentage_occupancy = mean(percentage_occupancy)) %>%
ggplot(aes(x = quarter,
y = mean_percentage_occupancy)) +
geom_point() +
geom_line(group = 1)

beds_select %>%
filter(!is.na(all_staffed_beddays)) %>%
group_by(quarter) %>%
summarise(mean_staffed_beddays = mean(all_staffed_beddays)) %>%
ggplot(aes(x = quarter,
y = mean_staffed_beddays)) +
geom_point() +
geom_line(group = 1)

beds_select %>%
filter(!is.na(average_available_staffed_beds)) %>%
group_by(quarter) %>%
summarise(mean_avg_staffed_beddays = mean(average_available_staffed_beds)) %>%
ggplot(aes(x = quarter,
y = mean_avg_staffed_beddays)) +
geom_point() +
geom_line(group = 1)

beds_select %>%
filter(!is.na(average_available_staffed_beds)) %>%
mutate(empty_beddays = all_staffed_beddays - total_occupied_beddays) %>%
group_by(quarter) %>%
summarise(mean_empty = mean(empty_beddays)) %>%
ggplot(aes(x = quarter,
y= mean_empty)) +
geom_point() +
geom_line(group = 1)

beds_select %>%
filter(!is.na(percentage_occupancy)) %>%
group_by(quarter, hb) %>%
summarise(mean_percentage_occupancy = mean(percentage_occupancy)) %>%
ggplot(aes(x = quarter,
y = mean_percentage_occupancy)) +
geom_point() +
geom_line(aes(group = hb, colour = hb))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

`
beds_select %>%
filter(!is.na(average_occupied_beds)) %>%
group_by(quarter) %>%
summarise(mean_average_occupied_beds = mean(average_occupied_beds)) %>%
ggplot(aes(x = quarter,
y = mean_average_occupied_beds)) +
geom_point() +
geom_line(group = 1)

beds_select %>%
group_by(year) %>%
summarise(mean_year_bed = mean(average_occupied_beds)) %>%
ggplot(aes(x = year,
y = mean_year_bed)) +
geom_line()

beds_select %>%
group_by(season) %>%
summarise(mean_year_bed = mean(average_occupied_beds)) %>%
ggplot(aes(x = season,
y = mean_year_bed)) +
geom_col() +
scale_x_discrete(limits = c("Spring", "Summer", "Autumn", "Winter"))

beds_select %>%
filter(!is.na(percentage_occupancy)) %>%
group_by(season) %>%
summarise(mean_prct_beds = mean(percentage_occupancy)) %>%
ggplot(aes(x = season,
y = mean_prct_beds)) +
geom_col() +
scale_x_discrete(limits = c("Spring", "Summer", "Autumn", "Winter"))

beds_select %>%
filter(!is.na(total_occupied_beddays)) %>%
group_by(season) %>%
summarise(mean_occupied_beddays = mean(total_occupied_beddays)) %>%
ggplot(aes(x = season,
y = mean_occupied_beddays)) +
geom_col() +
scale_x_discrete(limits = c("Spring", "Summer", "Autumn", "Winter"))

beds_select %>%
filter(quarter == "2016Q4")
beds_select %>%
ggplot(aes(x = season,
y = percentage_occupancy)) +
geom_col() +
facet_wrap(~ specialty_name)
beds_select %>%
filter(!is.na(percentage_occupancy)) %>%
group_by(specialty_name, month) %>%
summarise(mean_pct_speciality = mean(percentage_occupancy)) %>%
ggplot(aes(x = month,
y = mean_pct_speciality)) +
geom_point() +
geom_line(aes(group = specialty_name, colour = specialty_name))+
theme(legend.position = "none")
`summarise()` has grouped output by 'specialty_name'. You can override using the `.groups` argument.

beds_select %>%
filter(percentage_occupancy == 100,
year == 2017) %>%
group_by(season, hb) %>%
summarise(count = n()) %>%
ggplot(aes(x = season,
y = count)) +
geom_col(aes(fill = hb), position = "dodge")
`summarise()` has grouped output by 'season'. You can override using the `.groups` argument.

beds_select %>%
mutate(bins =
case_when(percentage_occupancy < 25 ~ "<25",
percentage_occupancy < 50 ~ "25-50",
percentage_occupancy < 75 ~ "50-75",
percentage_occupancy > 75 ~ ">75"
)
) %>%
filter(bins == "<25") %>%
group_by(season) %>%
summarise(count = n())
simd_treatment %>%
filter(!is.na(average_length_of_stay)) %>%
group_by(quarter) %>%
summarise(mean_avg_stay = mean(average_length_of_stay)) %>%
ggplot(aes(x = quarter,
y = mean_avg_stay)) +
geom_point() +
geom_line(group = 1)

simd_treatment %>%
filter(!is.na(average_length_of_stay)) %>%
group_by(quarter, admission_type) %>%
summarise(mean_avg_stay = mean(average_length_of_stay)) %>%
ggplot(aes(x = quarter,
y = mean_avg_stay)) +
geom_point() +
geom_line(aes(group = admission_type, colour = admission_type))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

simd_treatment %>%
filter(!is.na(average_length_of_stay),
simd == 5) %>%
mutate(simd = replace_na(simd, 0)) %>%
group_by(quarter, simd) %>%
summarise(mean_avg_stay = mean(average_length_of_stay)) %>%
ggplot(aes(x = quarter,
y = mean_avg_stay)) +
geom_point() +
geom_line(aes(group = simd, colour = simd))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

simd_treatment %>%
filter(!is.na(average_length_of_stay),
simd == 1) %>%
mutate(simd = replace_na(simd, 0)) %>%
group_by(quarter, simd) %>%
summarise(mean_avg_stay = mean(average_length_of_stay)) %>%
ggplot(aes(x = quarter,
y = mean_avg_stay)) +
geom_point() +
geom_line(aes(group = simd, colour = simd))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

simd_treatment %>%
filter(!is.na(average_length_of_episode)) %>%
group_by(quarter, admission_type) %>%
summarise(mean_avg_epidsode = mean(average_length_of_episode)) %>%
ggplot(aes(x = quarter,
y = mean_avg_epidsode)) +
geom_point() +
geom_line(aes(group = admission_type, colour = admission_type))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.

simd_treatment %>%
filter(!is.na(average_length_of_episode),
simd == 5) %>%
group_by(quarter) %>%
summarise(mean_avg_episode = mean(average_length_of_episode)) %>%
ggplot(aes(x = quarter,
y = mean_avg_episode)) +
geom_point() +
geom_line(group = 1)

simd_treatment %>%
filter(!is.na(average_length_of_episode),
simd == 1) %>%
group_by(quarter) %>%
summarise(mean_avg_episode = mean(average_length_of_episode)) %>%
ggplot(aes(x = quarter,
y = mean_avg_episode)) +
geom_point() +
geom_line(group = 1)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkoc2tpbXIpCmxpYnJhcnkodHNpYmJsZSkKbGlicmFyeShsdWJyaWRhdGUpCmBgYAoKCmBgYHtyfQpiZWRzIDwtIHJlYWRfY3N2KCJyYXdfZGF0YS9ub25fY292aWRfcmF3X2RhdGEvYmVkc19ieV9uaHNfYm9hcmRfb2ZfdHJlYXRtZW50X2FuZF9zcGVjaWFsdHkuY3N2IikgJT4lIAogIGNsZWFuX25hbWVzKCkKYGBgCgoKYGBge3J9CmdsaW1wc2UoYmVkcykKYGBgCgoKYGBge3J9CnNraW0oYmVkcykKYGBgCgoKYGBge3J9CnZpZXcoYmVkcykKYGBgCgoKYGBge3J9CmJlZHMgJT4lIAogIGFycmFuZ2UoZGVzYyhhbGxfc3RhZmZlZF9iZWRkYXlzKSkKYGBgCgoKYGBge3J9CmJlZHMgJT4lIAogIGRpc3RpbmN0KGxvY2F0aW9uKQoKYmVkcyAlPiUgCiAgZGlzdGluY3QoaGIpCgpiZWRzICU+JSAKICBkaXN0aW5jdChhbGxfc3RhZmZlZF9iZWRkYXlzKQoKYmVkcyAlPiUgCiAgZGlzdGluY3QodG90YWxfb2NjdXBpZWRfYmVkZGF5cykKYGBgCgoKYGBge3J9CmJlZHMgJT4lIAogIGdncGxvdChhZXMoeCA9IGFsbF9zdGFmZmVkX2JlZGRheXMpKSArCiAgZ2VvbV9oaXN0b2dyYW0oY29sID0gIndoaXRlIikrCiAgc2NhbGVfeF9sb2cxMCgpCmBgYAoKCmBgYHtyfQpiZWRzICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB0b3RhbF9vY2N1cGllZF9iZWRkYXlzKSkgKwogIGdlb21faGlzdG9ncmFtKGNvbCA9ICJ3aGl0ZSIpKwogIHNjYWxlX3hfbG9nMTAoKQpgYGAKCgpgYGB7cn0KYmVkcyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gYXZlcmFnZV9vY2N1cGllZF9iZWRzKSkgKwogIGdlb21faGlzdG9ncmFtKGNvbCA9ICJ3aGl0ZSIpKwogIHNjYWxlX3hfbG9nMTAoKQpgYGAKCgpgYGB7cn0KYmVkcyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGVyY2VudGFnZV9vY2N1cGFuY3kpKSArCiAgZ2VvbV9oaXN0b2dyYW0oY29sID0gIndoaXRlIikKYGBgCgoKYGBge3J9CmJlZHNfc2VsZWN0IDwtIGJlZHMgJT4lIAogIG11dGF0ZShkYXRlID0geXEocXVhcnRlciksCiAgICAgICAgIHllYXIgPSB5ZWFyKGRhdGUpLAogICAgICAgICBtb250aCA9IG1vbnRoKGRhdGUsIGxhYmVsID0gVFJVRSwgYWJiciA9IEZBTFNFKSwKICAgICAgICAgc2Vhc29uID0gY2FzZV93aGVuKAogICAgICAgICAgIHN0cl9kZXRlY3QobW9udGgsICJKYW51YXJ5IikgfiAiV2ludGVyIiwKICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiQXByaWwiKSB+ICJTcHJpbmciLAogICAgICAgICAgIHN0cl9kZXRlY3QobW9udGgsICJKdWx5IikgfiAiU3VtbWVyIiwKICAgICAgICAgICBzdHJfZGV0ZWN0KG1vbnRoLCAiT2N0b2JlciIpIH4gIkF1dHVtbiIpLAogICAgICAgICBzZWFzb24gPSBmYWN0b3Ioc2Vhc29uLCBvcmRlciA9IFRSVUUpKSAlPiUgCiAgc2VsZWN0KHF1YXJ0ZXIsIGhiLCBsb2NhdGlvbiwgc3BlY2lhbHR5X25hbWUsIGFsbF9zdGFmZmVkX2JlZGRheXMsIHRvdGFsX29jY3VwaWVkX2JlZGRheXMsIGF2ZXJhZ2VfYXZhaWxhYmxlX3N0YWZmZWRfYmVkcywgYXZlcmFnZV9vY2N1cGllZF9iZWRzLCBwZXJjZW50YWdlX29jY3VwYW5jeSwgZGF0ZSwgeWVhciwgbW9udGgsIHNlYXNvbikKYGBgCgoKYGBge3J9CmJlZHNfc2VsZWN0ICU+JQogIGZpbHRlcighaXMubmEocGVyY2VudGFnZV9vY2N1cGFuY3kpKSAlPiUgCiAgZ3JvdXBfYnkocXVhcnRlcikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3BlcmNlbnRhZ2Vfb2NjdXBhbmN5ID0gbWVhbihwZXJjZW50YWdlX29jY3VwYW5jeSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLAogICAgICAgICAgICAgeSA9IG1lYW5fcGVyY2VudGFnZV9vY2N1cGFuY3kpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoZ3JvdXAgPSAxKQpgYGAKCgpgYGB7cn0KYmVkc19zZWxlY3QgJT4lCiAgZmlsdGVyKCFpcy5uYSh0b3RhbF9vY2N1cGllZF9iZWRkYXlzKSkgJT4lIAogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSAKICBzdW1tYXJpc2UobWVhbl9vY2N1cGllZF9iZWRkYXlzID0gbWVhbih0b3RhbF9vY2N1cGllZF9iZWRkYXlzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsCiAgICAgICAgICAgICB5ID0gbWVhbl9vY2N1cGllZF9iZWRkYXlzKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGdyb3VwID0gMSkKYGBgCgoKYGBge3J9CmJlZHNfc2VsZWN0ICU+JQogIGZpbHRlcighaXMubmEoYWxsX3N0YWZmZWRfYmVkZGF5cykpICU+JSAKICBncm91cF9ieShxdWFydGVyKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fc3RhZmZlZF9iZWRkYXlzID0gbWVhbihhbGxfc3RhZmZlZF9iZWRkYXlzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsCiAgICAgICAgICAgICB5ID0gbWVhbl9zdGFmZmVkX2JlZGRheXMpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoZ3JvdXAgPSAxKQpgYGAKCgpgYGB7cn0KYmVkc19zZWxlY3QgJT4lCiAgZmlsdGVyKCFpcy5uYShhdmVyYWdlX2F2YWlsYWJsZV9zdGFmZmVkX2JlZHMpKSAlPiUgCiAgZ3JvdXBfYnkocXVhcnRlcikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2F2Z19zdGFmZmVkX2JlZGRheXMgPSBtZWFuKGF2ZXJhZ2VfYXZhaWxhYmxlX3N0YWZmZWRfYmVkcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLAogICAgICAgICAgICAgeSA9IG1lYW5fYXZnX3N0YWZmZWRfYmVkZGF5cykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShncm91cCA9IDEpCmBgYAoKCmBgYHtyfQpiZWRzX3NlbGVjdCAlPiUKICBmaWx0ZXIoIWlzLm5hKGF2ZXJhZ2VfYXZhaWxhYmxlX3N0YWZmZWRfYmVkcykpICU+JSAKICBtdXRhdGUoZW1wdHlfYmVkZGF5cyA9IGFsbF9zdGFmZmVkX2JlZGRheXMgLSB0b3RhbF9vY2N1cGllZF9iZWRkYXlzKSAlPiUgCiAgZ3JvdXBfYnkocXVhcnRlcikgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZW1wdHkgPSBtZWFuKGVtcHR5X2JlZGRheXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwKICAgICAgICAgICAgIHk9IG1lYW5fZW1wdHkpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoZ3JvdXAgPSAxKQpgYGAKCgoKYGBge3J9CmJlZHNfc2VsZWN0ICU+JQogIGZpbHRlcighaXMubmEocGVyY2VudGFnZV9vY2N1cGFuY3kpKSAlPiUgCiAgZ3JvdXBfYnkocXVhcnRlciwgaGIpICU+JSAKICBzdW1tYXJpc2UobWVhbl9wZXJjZW50YWdlX29jY3VwYW5jeSA9IG1lYW4ocGVyY2VudGFnZV9vY2N1cGFuY3kpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwKICAgICAgICAgICAgIHkgPSBtZWFuX3BlcmNlbnRhZ2Vfb2NjdXBhbmN5KSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGhiLCBjb2xvdXIgPSBoYikpCmBgYAoKCmAKYGBge3J9CmJlZHNfc2VsZWN0ICU+JQogIGZpbHRlcighaXMubmEoYXZlcmFnZV9vY2N1cGllZF9iZWRzKSkgJT4lIAogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSAKICBzdW1tYXJpc2UobWVhbl9hdmVyYWdlX29jY3VwaWVkX2JlZHMgPSBtZWFuKGF2ZXJhZ2Vfb2NjdXBpZWRfYmVkcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLAogICAgICAgICAgICAgeSA9IG1lYW5fYXZlcmFnZV9vY2N1cGllZF9iZWRzKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGdyb3VwID0gMSkKYGBgCgoKCmBgYHtyfQpiZWRzX3NlbGVjdCAlPiUgCiAgZ3JvdXBfYnkoeWVhcikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3llYXJfYmVkID0gbWVhbihhdmVyYWdlX29jY3VwaWVkX2JlZHMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwKICAgICAgICAgICAgIHkgPSBtZWFuX3llYXJfYmVkKSkgKwogIGdlb21fbGluZSgpCmBgYAoKCmBgYHtyfQpiZWRzX3NlbGVjdCAlPiUgCiAgZ3JvdXBfYnkoc2Vhc29uKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5feWVhcl9iZWQgPSBtZWFuKGF2ZXJhZ2Vfb2NjdXBpZWRfYmVkcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzZWFzb24sCiAgICAgICAgICAgICB5ID0gbWVhbl95ZWFyX2JlZCkpICsKICBnZW9tX2NvbCgpICsgCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJTcHJpbmciLCAiU3VtbWVyIiwgIkF1dHVtbiIsICJXaW50ZXIiKSkKYGBgCgoKCmBgYHtyfQpiZWRzX3NlbGVjdCAlPiUgCiAgZmlsdGVyKCFpcy5uYShwZXJjZW50YWdlX29jY3VwYW5jeSkpICU+JSAKICBncm91cF9ieShzZWFzb24pICU+JSAKICBzdW1tYXJpc2UobWVhbl9wcmN0X2JlZHMgPSBtZWFuKHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHNlYXNvbiwKICAgICAgICAgICAgIHkgPSBtZWFuX3ByY3RfYmVkcykpICsKICBnZW9tX2NvbCgpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIlNwcmluZyIsICJTdW1tZXIiLCAiQXV0dW1uIiwgIldpbnRlciIpKQpgYGAKCgpgYGB7cn0KYmVkc19zZWxlY3QgJT4lIAogIGZpbHRlcighaXMubmEodG90YWxfb2NjdXBpZWRfYmVkZGF5cykpICU+JSAKICBncm91cF9ieShzZWFzb24pICU+JSAKICBzdW1tYXJpc2UobWVhbl9vY2N1cGllZF9iZWRkYXlzID0gbWVhbih0b3RhbF9vY2N1cGllZF9iZWRkYXlzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHNlYXNvbiwKICAgICAgICAgICAgIHkgPSBtZWFuX29jY3VwaWVkX2JlZGRheXMpKSArCiAgZ2VvbV9jb2woKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJTcHJpbmciLCAiU3VtbWVyIiwgIkF1dHVtbiIsICJXaW50ZXIiKSkKYGBgCgoKYGBge3J9CmJlZHNfc2VsZWN0ICU+JSAKICBmaWx0ZXIocXVhcnRlciA9PSAiMjAxNlE0IikKYGBgCgoKYGBge3J9CmJlZHNfc2VsZWN0ICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzZWFzb24sCiAgICAgICAgICAgICB5ID0gcGVyY2VudGFnZV9vY2N1cGFuY3kpKSArCiAgZ2VvbV9jb2woKSArCiAgZmFjZXRfd3JhcCh+IHNwZWNpYWx0eV9uYW1lKQpgYGAKCgpgYGB7cn0KYmVkc19zZWxlY3QgJT4lIAogIGZpbHRlcighaXMubmEocGVyY2VudGFnZV9vY2N1cGFuY3kpKSAlPiUgCiAgZ3JvdXBfYnkoc3BlY2lhbHR5X25hbWUsIG1vbnRoKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fcGN0X3NwZWNpYWxpdHkgPSBtZWFuKHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KSkgJT4lIAogIGdncGxvdChhZXMoeCA9IG1vbnRoLAogICAgICAgICAgICAgeSA9IG1lYW5fcGN0X3NwZWNpYWxpdHkpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc3BlY2lhbHR5X25hbWUsIGNvbG91ciA9IHNwZWNpYWx0eV9uYW1lKSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCgoKYGBge3J9CmJlZHNfc2VsZWN0ICU+JQogIGZpbHRlcihwZXJjZW50YWdlX29jY3VwYW5jeSA9PSAxMDAsCiAgICAgICAgIHllYXIgPT0gMjAxNykgJT4lIAogIGdyb3VwX2J5KHNlYXNvbiwgaGIpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzZWFzb24sCiAgICAgICAgICAgICB5ID0gY291bnQpKSArCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBoYiksIHBvc2l0aW9uID0gImRvZGdlIikKCmBgYAoKCmBgYHtyfQpiZWRzX3NlbGVjdCAlPiUgCiAgbXV0YXRlKGJpbnMgPSAKICAgIGNhc2Vfd2hlbihwZXJjZW50YWdlX29jY3VwYW5jeSA8IDI1IH4gIjwyNSIsCiAgICAgICAgICAgICAgcGVyY2VudGFnZV9vY2N1cGFuY3kgPCA1MCB+ICIyNS01MCIsCiAgICAgICAgICAgICAgcGVyY2VudGFnZV9vY2N1cGFuY3kgPCA3NSB+ICI1MC03NSIsCiAgICAgICAgICAgICAgcGVyY2VudGFnZV9vY2N1cGFuY3kgPiA3NSB+ICI+NzUiCiAgICApCiAgKSAlPiUgCiAgZmlsdGVyKGJpbnMgPT0gIjwyNSIpICU+JSAKICBncm91cF9ieShzZWFzb24pICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpCmBgYAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCgoKCmBgYHtyfQpzaW1kX3RyZWF0bWVudCA8LSByZWFkX2NzdigicmF3X2RhdGEvbm9uX2NvdmlkX3Jhd19kYXRhL2lucGF0aWVudF9hbmRfZGF5Y2FzZV9ieV9uaHNfYm9hcmRfb2ZfdHJlYXRtZW50X2FuZF9zaW1kLmNzdiIpICU+JSBjbGVhbl9uYW1lcygpCmBgYAoKCmBgYHtyfQpzaW1kX3RyZWF0bWVudCAlPiUgCiAgZmlsdGVyKCFpcy5uYShhdmVyYWdlX2xlbmd0aF9vZl9zdGF5KSkgJT4lIAogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSAKICBzdW1tYXJpc2UobWVhbl9hdmdfc3RheSA9IG1lYW4oYXZlcmFnZV9sZW5ndGhfb2Zfc3RheSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLAogICAgICAgICAgICAgeSA9IG1lYW5fYXZnX3N0YXkpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoZ3JvdXAgPSAxKQpgYGAKCgpgYGB7cn0Kc2ltZF90cmVhdG1lbnQgJT4lIAogIGZpbHRlcighaXMubmEoYXZlcmFnZV9sZW5ndGhfb2Zfc3RheSkpICU+JSAKICBncm91cF9ieShxdWFydGVyLCBhZG1pc3Npb25fdHlwZSkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2F2Z19zdGF5ID0gbWVhbihhdmVyYWdlX2xlbmd0aF9vZl9zdGF5KSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsCiAgICAgICAgICAgICB5ID0gbWVhbl9hdmdfc3RheSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBhZG1pc3Npb25fdHlwZSwgY29sb3VyID0gYWRtaXNzaW9uX3R5cGUpKQpgYGAKCgpgYGB7cn0Kc2ltZF90cmVhdG1lbnQgJT4lIAogIGZpbHRlcighaXMubmEoYXZlcmFnZV9sZW5ndGhfb2Zfc3RheSksCiAgICAgICAgIHNpbWQgPT0gNSkgJT4lIAogIG11dGF0ZShzaW1kID0gcmVwbGFjZV9uYShzaW1kLCAwKSkgJT4lIAogIGdyb3VwX2J5KHF1YXJ0ZXIsIHNpbWQpICU+JSAKICBzdW1tYXJpc2UobWVhbl9hdmdfc3RheSA9IG1lYW4oYXZlcmFnZV9sZW5ndGhfb2Zfc3RheSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLAogICAgICAgICAgICAgeSA9IG1lYW5fYXZnX3N0YXkpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc2ltZCwgY29sb3VyID0gc2ltZCkpCmBgYAoKCmBgYHtyfQpzaW1kX3RyZWF0bWVudCAlPiUgCiAgZmlsdGVyKCFpcy5uYShhdmVyYWdlX2xlbmd0aF9vZl9zdGF5KSwKICAgICAgICAgc2ltZCA9PSAxKSAlPiUgCiAgbXV0YXRlKHNpbWQgPSByZXBsYWNlX25hKHNpbWQsIDApKSAlPiUgCiAgZ3JvdXBfYnkocXVhcnRlciwgc2ltZCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2F2Z19zdGF5ID0gbWVhbihhdmVyYWdlX2xlbmd0aF9vZl9zdGF5KSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsCiAgICAgICAgICAgICB5ID0gbWVhbl9hdmdfc3RheSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzaW1kLCBjb2xvdXIgPSBzaW1kKSkKYGBgCgoKCmBgYHtyfQpzaW1kX3RyZWF0bWVudCAlPiUgCiAgZmlsdGVyKCFpcy5uYShhdmVyYWdlX2xlbmd0aF9vZl9zdGF5KSkgJT4lIAogIG11dGF0ZShzaW1kID0gcmVwbGFjZV9uYShzaW1kLCAwKSkgJT4lIAogIGdyb3VwX2J5KHF1YXJ0ZXIsIHNpbWQpICU+JSAKICBzdW1tYXJpc2UobWVhbl9hdmdfc3RheSA9IG1lYW4oYXZlcmFnZV9sZW5ndGhfb2Zfc3RheSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLAogICAgICAgICAgICAgeSA9IG1lYW5fYXZnX3N0YXkpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc2ltZCwgY29sb3VyID0gc2ltZCkpCmBgYAoKCgpgYGB7cn0Kc2ltZF90cmVhdG1lbnQgJT4lIAogIGZpbHRlcighaXMubmEoYXZlcmFnZV9sZW5ndGhfb2ZfZXBpc29kZSkpICU+JSAKICBncm91cF9ieShxdWFydGVyKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fYXZnX2VwaXNvZGUgPSBtZWFuKGF2ZXJhZ2VfbGVuZ3RoX29mX2VwaXNvZGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwKICAgICAgICAgICAgIHkgPSBtZWFuX2F2Z19lcGlzb2RlKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGdyb3VwID0gMSkKYGBgCgoKYGBge3J9CnNpbWRfdHJlYXRtZW50ICU+JSAKICBmaWx0ZXIoIWlzLm5hKGF2ZXJhZ2VfbGVuZ3RoX29mX2VwaXNvZGUpKSAlPiUgCiAgZ3JvdXBfYnkocXVhcnRlciwgYWRtaXNzaW9uX3R5cGUpICU+JSAKICBzdW1tYXJpc2UobWVhbl9hdmdfZXBpZHNvZGUgPSBtZWFuKGF2ZXJhZ2VfbGVuZ3RoX29mX2VwaXNvZGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwKICAgICAgICAgICAgIHkgPSBtZWFuX2F2Z19lcGlkc29kZSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBhZG1pc3Npb25fdHlwZSwgY29sb3VyID0gYWRtaXNzaW9uX3R5cGUpKQpgYGAKCgpgYGB7cn0Kc2ltZF90cmVhdG1lbnQgJT4lIAogIGZpbHRlcighaXMubmEoYXZlcmFnZV9sZW5ndGhfb2ZfZXBpc29kZSksCiAgICAgICAgIHNpbWQgPT0gNSkgJT4lIAogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSAKICBzdW1tYXJpc2UobWVhbl9hdmdfZXBpc29kZSA9IG1lYW4oYXZlcmFnZV9sZW5ndGhfb2ZfZXBpc29kZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLAogICAgICAgICAgICAgeSA9IG1lYW5fYXZnX2VwaXNvZGUpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoZ3JvdXAgPSAxKQpgYGAKCgpgYGB7cn0Kc2ltZF90cmVhdG1lbnQgJT4lIAogIGZpbHRlcighaXMubmEoYXZlcmFnZV9sZW5ndGhfb2ZfZXBpc29kZSksCiAgICAgICAgIHNpbWQgPT0gMSkgJT4lIAogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSAKICBzdW1tYXJpc2UobWVhbl9hdmdfZXBpc29kZSA9IG1lYW4oYXZlcmFnZV9sZW5ndGhfb2ZfZXBpc29kZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLAogICAgICAgICAgICAgeSA9IG1lYW5fYXZnX2VwaXNvZGUpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoZ3JvdXAgPSAxKQpgYGAKCgoK